package com.nado.extensions.reload;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * {@link Reloadable} 객체들을 관리하는 Collection 클래스(singleton)
 *
 */
public class WatchedObject {

	/**
	 * WatchedObject 의 싱글턴 객체
	 */
	private static WatchedObject object;

	/**
	 * 활성화 여부
	 */
	private boolean active;

	/**
	 * {@link ObjectWatcher}를 통해 관리할 대상 리스트
	 */
	private List<Reloadable> watchedObjects;

	private WatchedObject() {
		watchedObjects = new ArrayList<Reloadable>();
	}

	/**
	 * WatchedObject에 대한 참조 객체를 반환한다.
	 */
	public static synchronized WatchedObject getInstance() {
		if (object == null) {
			object = new WatchedObject();
		}
		return object;
	}

	/**
	 * WatchedObject 활성화 여부를 설정한다.
	 */
	public void setActive(boolean active) {
		this.active = active;
	}

	/**
	 * {@link Readable}을 추가한다.
	 * 해당 {@link Reloadable}이 이미 존재하는 경우에는 추가하지 않는다.
	 */
	public void add(Reloadable reloadable) {
		if (active && !watchedObjects.contains(reloadable)) {
			watchedObjects.add(reloadable);
		}
	}

	/**
	 * {@link Reloadable}을 read-only 타입의 리스트로 반환한다.
	 */
	public List<Reloadable> getReloadables() {
		return Collections.unmodifiableList(watchedObjects);
	}

	/**
	 * {@link Readable} 리스트를 삭제한다.
	 */
	public void clear() {
		watchedObjects.clear();
	}
}
